package projetbi_dao;

import java.sql.Statement;
import java.sql.Connection;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import projetbi_objets.OCollaborateur;

/**
 * Projet BI - M2 FIC 2012-2013
 *
 * @author Jef, Tuan-Long, William, Mohamed
 */
public class DAOCollaborateur extends DAO<OCollaborateur> {

    /**
     *
     * @param obj L'objet à ajouter à la base de données <br/>
     *
     * requires <br/>
     *
     * ensures <br/>
     *   // La table en question n'est pas vide
     */
    @Override
    public OCollaborateur create(OCollaborateur obj) {

        Connection connect = this.connect;
        String sql = "INSERT INTO `collaborateur` (`idCollaborateur`, `nom`, `prenom`, `dateDeNaissance`, `anneesExp`, `titreProfil`, `secteurActivite`, `disponibilite`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
        try {
            PreparedStatement ps = (PreparedStatement) connect.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            ps.setInt(1, 0);
            ps.setString(2, obj.getNom());
            ps.setString(3, obj.getPrenom());
            ps.setDate(4, new java.sql.Date(obj.getDateDeNaissance().getTime()));
            ps.setInt(5, obj.getAnneesExp());
            ps.setString(6, obj.getTitreProfil());
            ps.setInt(7, obj.getSecteurActivite());
            ps.setInt(8, obj.getDisponibilite());
            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();
            if (rs.next()) {
                obj.setIdCollaborateur(rs.getInt(1));
            }
            ps.close();

        } catch (SQLException ex) {
            Logger.getLogger(DAOCollaborateur.class.getName()).log(Level.SEVERE, null, ex);
        }


        return obj;
    }

    /**
     *
     * @param id L'identifiant de l'objet que l'on cherche dans la base <br/>
     *
     * requires <br/>
     *
     * ensures <br/>
     *
     */
    @Override
    public OCollaborateur find(int id) {
        OCollaborateur lang = new OCollaborateur();
        try {
            ResultSet result = this.connect
                    .createStatement(
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_UPDATABLE).executeQuery(
                    "SELECT * FROM collaborateur WHERE idCollaborateur = " + id);
            if (result.first()) {
                lang = new OCollaborateur(
                        id,
                        result.getString("nom"),
                        result.getString("prenom"),
                        result.getDate("dateDeNaissance"),
                        result.getInt("anneesExp"),
                        result.getString("titreProfil"),
                        result.getInt("secteurActivite"),
                        result.getInt("disponibilite"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return lang;

    }

    // Trouve un OCollaborateur via son nom et son prénom
    public OCollaborateur findByFullName(String nom1, String prenom1) {
        OCollaborateur lang = new OCollaborateur();
        try {
            ResultSet result = this.connect
                    .createStatement(
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_UPDATABLE).executeQuery(
                    //"SELECT * FROM collaborateur WHERE nom = " + nom1 + " AND prenom = " + prenom1);
                    "SELECT * FROM collaborateur WHERE nom = " + nom1);
            if (result.first()) {
                lang = new OCollaborateur(
                        result.getInt("idCollaborateur"),
                        nom1,
                        prenom1,
                        result.getDate("dateDeNaissance"),
                        result.getInt("anneesExp"),
                        result.getString("titreProfil"),
                        result.getInt("secteurActivite"),
                        result.getInt("disponibilite"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return lang;
    }

    // Update : mise à jour d'un objet en base.
    @Override
    public OCollaborateur update(OCollaborateur obj) {
        Connection connect = this.connect;
        String sql = "UPDATE collaborateur SET nom = ?, prenom = ?, dateDeNaissance = ?, anneesExp = ?, titreProfil = ?, secteurActivite = ?, disponibilite = ? WHERE idCollaborateur = ?";
        try {
            PreparedStatement ps = connect.prepareStatement(sql);
            ps.setString(1, obj.getNom());
            ps.setString(2, obj.getPrenom());
            ps.setDate(3, new java.sql.Date(obj.getDateDeNaissance().getTime()));
            ps.setInt(4, obj.getAnneesExp());
            ps.setString(5, obj.getTitreProfil());
            ps.setInt(6, obj.getSecteurActivite());
            ps.executeUpdate();
            ps.close();

        } catch (SQLException ex) {
            Logger.getLogger(DAOCollaborateur.class.getName()).log(Level.SEVERE, null, ex);
        }


        return obj;
    }

    // Delete : suppression d'un objet en base.
    @Override
    public void delete(int id) {
        Connection connect = this.connect;
        String sql = "DELETE FROM collaborateur WHERE idCollaborateur = ?";
        try {
            PreparedStatement ps = connect.prepareStatement(sql);
            ps.setInt(1, id);
            ps.executeUpdate();
            ps.close();
        } catch (SQLException ex) {
            Logger.getLogger(DAOCollaborateur.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public int getMax() {
        int res = 0;
        try {
            ResultSet result = this.connect
                    .createStatement(
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_UPDATABLE).executeQuery(
                    "SELECT MAX('idCollaborateur') as id");
            if (result.first()) {
                res = result.getInt("id");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return res;
    }
}
